#include <iostream>
 
using namespace std;

/**
 * C++ 引用,引用变量是一个别名，也就是说，它是某个已存在变量的另一个名字。
 * 一旦把引用初始化为某个变量，就可以使用该引用名称或变量名称来指向变量。
 * 
 * C++ 引用 vs 指针:
 * 引用很容易与指针混淆，它们之间有三个主要的不同：
 * 1. 不存在空引用。引用必须连接到一块合法的内存。
 * 2. 一旦引用被初始化为一个对象，就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
 * 3. 引用必须在创建时被初始化。指针可以在任何时间被初始化。
*/

void change(int num){
   num = 22;
}
// 把引用作为参数
void changeReference(int& num){
   num = 22;
}

int& change3(int& num)
{
    // 把引用作为返回值
    int& ret = num;
    return ret;
}
 
int main ()
{
    int    i;
    int k = 10;
    
    // 声明引用变量
    int&    r = i;
    
    i = 5;
    cout << "Value of i : " << i << endl; // Value of i : 5
    cout << "Value of i reference : " << r  << endl; // Value of i reference : 5

    r = 10;
    cout << "Value of i : " << i << endl; // Value of i : 10
    cout << "Value of i reference : " << r  << endl; // Value of i reference : 10
    
    cout << "i:" << i << endl; // i:10
    change(i);
    cout << "after change: " << i  << endl; // after change: 10
    changeReference(i); 
    cout << "after changeReference: " << i  << endl; // after changeReference: 22

    cout << "k:" << k << endl; // k:10
    int& ret = change3(k); 
    ret = 88;
    cout << "after change3: " << k  << endl; // after change3: 88
    
    return 0;
}